package org.shj.jvm;

/**
 * 在Java中，创建一个对象常常需要经历如下几个过程：
 * 父类的类构造器<clinit>() ->  子类的类构造器<clinit>()->父类的成员变量和实例代码块->父类的构造函数->子类的成员变量和实例代码块->子类的构造函数
 *
 * 类的生命周期是：加载->验证->准备->解析->初始化->使用->卸载，并且只有在准备阶段和初始化阶段才会涉及类变量的初始化和赋值
 * @author Shen Huang Jian
 * @date 2021-06-09 14:33
 */
public class ClassInitDemo {

    public static void main(String[] args) {
        staticFunction();
    }

    static ClassInitDemo st = new ClassInitDemo();

    static {   //静态代码块
        System.out.println("1");
    }

    {       // 实例代码块
        System.out.println("2");
    }

    ClassInitDemo() {    // 实例构造器
        System.out.println("3");
        System.out.println("a=" + a + ",b=" + b + ", c=" + c);
    }

    public static void staticFunction() {   // 静态方法
        System.out.println("4");
    }

    int a = 110;    // 实例变量
    static int b = 112;     // 静态变量
    //看看C和 b 输出值的区别
    final static int c = 112;

    //加上下面一句，看输出有什么变化
    //static ClassInitDemo st1 = new ClassInitDemo();
}
